<?php
App::uses('AppController', 'Controller');
/**
 * Trabalhos Controller
 *
 * @property Trabalho $Trabalho
 */
class TrabalhosController extends AppController {

	var $components = array('FileHandler');
	
	private function mostrar_nota($trabalhos){
		foreach($trabalhos as &$item){
			if($item['Avaliacao']['hora_pedido_reavaliacao'] == '0000-00-00 00:00:00'){
				$item['mostrar_nota'] = ($this->Datas->getDataDivulgacaoTrabalho() <= date('Y-m-d H:i:s'));
			}
			else{
				$item['mostrar_nota'] = ($this->Datas->getDataDivulgacaoReavaliado() <= date('Y-m-d H:i:s'));
			}
		}
		return $trabalhos;
	}
	
	public function index($id_categoria = null) {
		$this->Trabalho->recursive = 0;
		if($this->isUsuario()){
			$conditions = array('usuario_id'=>$this->usuarioSessao['Usuario']['id']);
			$this->recursive = 0;
			//$this->set('mostrar_nota', $this->mostrar_nota());
			$this->set('editar', ($this->Datas->getDataFimSubmissao() > date('Y-m-d H:i:s')));
			$this->set('trabalhos', $this->mostrar_nota($this->paginate($conditions)));
		}
		else if($this->isAdmin()){
			$this->set('categorias', $this->Trabalho->Categoria->find('list'));
			$this->set('id_categoria', $id_categoria);
			if(!is_null($id_categoria))
				$conditions = array('categoria_id'=>$id_categoria);
			else 
				$conditions = array();
			$this->set('trabalhos', $this->paginate($conditions));
			$this->render('index_admin');
		}
		else 
			$this->redirect('/pages/blank');
	}

	public function a_revisar(){
		//TODO revisar
		if($this->isRevisor()){
			$this->set('trabalhos', $this->Trabalho->listaDeTrabalhosParaRevisor($this->usuarioSessao['Usuario']['id']));
		}
		else
			$this->redirect('/pages/blank');
	}
	
	public function reavaliar($id = null){
		//TODO DONE implementar
		if($this->Datas->getDataReavaliacaoTrabalho() < date('Y-m-d H:i:s')){
			$this->Session->setFlash(__('O prazo para pedido de reavaliação terminou !'), 'flash/bootstrap', array('class'=>'alert alert-block'));
			$this->redirect('/pages/blank');
		}
		if($this->Datas->getDataDivulgacaoTrabalho() > date('Y-m-d H:i:s')){
			$this->Session->setFlash(__('Acesso inválido'), 'flash/bootstrap', array('class'=>'alert alert-error'));
			$this->redirect('/pages/blank');
		}
		$this->Trabalho->recursive = 0;
		$trabalho = $this->Trabalho->find('first', array('conditions' => array('Trabalho.' . $this->Trabalho->primaryKey => $id)));
		if($trabalho['Avaliacao']['hora_pedido_reavaliacao'] != '0000-00-00 00:00:00'){
			$this->Session->setFlash(__('Você já pediu reavaliação desse trabalho!'), 'flash/bootstrap', array('class'=>'alert alert-block'));
			$this->redirect('/pages/blank');
		}
		if($trabalho['Avaliacao']['nota'] != 0){
			$this->Session->setFlash(__('Acesso inválido'), 'flash/bootstrap', array('class'=>'alert alert-error'));
			$this->redirect('index');
		}
		if($this->isAdmin() || ($trabalho['Trabalho']['usuario_id'] == $this->usuarioSessao['Usuario']['id'])){
			if(!empty($this->request->data)){
				$this->request->data['Avaliacao']['hora_pedido_reavaliacao'] = date('Y-m-d H:i:s');
				$this->request->data['Avaliacao']['id'] = $trabalho['Avaliacao']['id'];
				if($this->Trabalho->Avaliacao->save($this->request->data)){
					$this->Session->setFlash(__('O trabalho será reavaliado'), 'flash/bootstrap', array('class'=>'alert alert-success'));
					$this->redirect('index');
				}
				else{
					$this->Session->setFlash(__('Pedido não pode ser enviado!'), 'flash/bootstrap', array('class'=>'alert alert-error'));
				}
			}
		}
	}
	
	public function dar_nota($id_trabalho = null){
		if($this->Datas->getDataFimSubmissao() >= date('Y-m-d H:i:s')){
			$this->Session->setFlash(__('O prazo de submissão ainda não terminou !'), 'flash/bootstrap', array('class'=>'alert alert-block'));
			$this->redirect('/pages/blank');
		}
		$trabalho = $this->Trabalho->podeCorrigir($this->usuarioSessao['Usuario']['id'], $id_trabalho);
		if($this->isRevisor() && $trabalho){
			if(!empty($this->request->data)){
				$this->request->data['Avaliacao']['id'] = $trabalho['Avaliacao']['id'];
				$this->request->data['Avaliacao']['trabalho_id'] = $id_trabalho;
				$this->request->data['Avaliacao']['avaliado_em'] = date('Y-m-d H:i:s');
				if($this->Trabalho->Avaliacao->save($this->request->data)){
					$this->Session->setFlash(__('Nota enviada!'), 'flash/bootstrap', array('class'=>'alert alert-success'));
					$this->redirect('/trabalhos/a_revisar');
				}
				else{
					$this->Session->setFlash(__('Nota não pôde ser enviada!'), 'flash/bootstrap', array('class'=>'alert alert-block'));
					$this->request->data = array_merge($trabalho, $this->request->data);
				}
			}else $this->request->data = $trabalho;
			$this->set('categorias', $this->Trabalho->Categoria->categoriasParaNota());
		}
		else {
			$this->notAuth();
		}
	}
	
	public function view($id = null) {
		if (!$this->Trabalho->exists($id)) {
			throw new NotFoundException(__('Trabalho Inválido'));
		}
		$options = array('conditions' => array('Trabalho.' . $this->Trabalho->primaryKey => $id));
		$trabalho = $this->Trabalho->find('first', $options);
		if($this->isAdmin())
			$this->set('trabalho', $trabalho);
		else {
			$auth = $this->Auth->user();
			if(($trabalho['Trabalho']['usuario_id'] == $auth['Usuario']['id']) || ($trabalho['Trabalho']['revisor_id'] == $auth['Usuario']['id'])){
				$this->set('trabalho', $trabalho);
				$this->set('mostrar_nota', ($this->Datas->getDataDivulgacaoTrabalho() < date('Y-m-d H:i:s')));
				$this->set('editar', ($this->Datas->getDataFimSubmissao() > date('Y-m-d H:i:s')));
			}
			else {
				$this->notAuth();
			}
		}
	}

/**
 * add method
 *
 * @return void
 */
	// TODO Mudar pasta onde ficam os arquivos
	public function submeter() {
		if($this->Datas->getDataInicioSubmissao() > date('Y-m-d H:i:s') || $this->Datas->getDataFimSubmissao() < date('Y-m-d H:i:s')){
			$this->Session->setFlash(__('Fora do prazo de submissão de trabalhos'), 'flash/bootstrap', array('class'=>'alert alert-block'));
			$this->redirect('/pages/blank');
		}
		if($this->isUsuario()){
			if ($this->request->is('post')) {
				$this->Trabalho->create();
				$this->request->data['Trabalho']['usuario_id'] = $this->usuarioSessao['Usuario']['id'];
				$this->request->data['Trabalho']['nome_original'] = $this->request->data['Trabalho']['trabalho']['name'];
				$pasta = $this->usuarioSessao['login'];
				$this->FileHandler->diretorio = DIRETORIO_TRABALHOS;
				$this->request->data['Trabalho']['caminho'] = $pasta.DS.time();
				if(!$this->FileHandler->validar($this->request->data['Trabalho']['trabalho'])){
					$this->Session->setFlash(__('Não foi possível validar esse trabalho'), 'flash/bootstrap', array('class'=>'alert alert-error'));
				}
				else {
					if($this->FileHandler->armazenar($pasta, $this->request->data['Trabalho']['caminho'], $this->request->data['Trabalho']['trabalho']['tmp_name'])){
						if ($this->Trabalho->save($this->request->data)){
							$this->Session->setFlash(__('O trabalho foi enviado com sucesso'), 'flash/bootstrap', array('class'=>'alert alert-success'));
							$this->redirect('/pages/blank');
						} else {
							$this->FileHandler->apagarArquivo($this->request->data['Trabalho']['caminho']);
							$this->Session->setFlash(__('O trabalho não foi enviado. Por favor tente novamente!'), 'flash/bootstrap', array('class'=>'alert alert-error'));
						}
					}
					else {
						$this->Session->setFlash(__('O trabalho não foi enviado. Por favor tente novamente!'), 'flash/bootstrap', array('class'=>'alert alert-error'));
					}
				}
			}
			$usuarios = $this->Trabalho->Usuario->find('list');
			$revisors = $this->Trabalho->Revisor->find('list');
			$categorias = $this->Trabalho->Categoria->find('list');
			$sessaos = $this->Trabalho->Sessao->find('list');
			$this->set(compact('usuarios', 'revisors', 'categorias', 'sessaos'));
		}
		else {
			$this->Session->setFlash(__('Apenas usuarios comuns e revisores podem submeter trabalhos.'), 'flash/bootstrap', array('class'=>'alert alert-block'));
			$this->redirect('/pages/blank');
		}
	}

	public function definir_revisores($id){
		//TODO marcar no select da view o atual e adicionar a opcao de apagar o revisor
		if($this->isAdmin()){
			$this->Trabalho->recursive = 0;
			$this->Trabalho->unbindModel(array('belongsTo'=>array('Usuario', 'Revisor', 'Sessao', 'Categoria')));
			$trabalho = $this->Trabalho->findById($id);
			if($this->request->is('post') || $this->request->is('put')){
				$trabalho['Trabalho']['revisor_id'] = $this->request->data['Trabalho']['revisores'];
				$trabalho['Avaliacao']['nota'] = NULL;
				$trabalho['Avaliacao']['justificativa'] = NULL;
				$trabalho['Avaliacao']['avaliado_em'] = '0000-00-00 00:00:00';
				$trabalho['Avaliacao']['hora_pedido_reavaliacao'] = '0000-00-00 00:00:00'; 
				if($this->Trabalho->saveAll($trabalho)){
					$this->Session->setFlash(__('Revisor definido com sucesso!'), 'flash/bootstrap', array('class'=>'alert alert-success'));
					$this->redirect(array('action' => 'view/'.$id));
				}
				else
					$this->Session->setFlash(__('Revisor não foi definido!'), 'flash/bootstrap', array('class'=>'alert alert-error'));
			}	
			$lista = $this->Trabalho->Usuario->listDeRevisores();
			$lista[0] = 'Apagar revisor';
			$this->set('revisores', $lista);
			$this->set('revisor_do_trabalho', $trabalho['Trabalho']['revisor_id']);
			$this->Trabalho->recursive = -1;
			$this->set('trabalho', $trabalho);
		}
		else {
			$this->notAuth();
		}
	}
	
	
	public function edit($id = null) {
		//TODO root edita apos submissao ? 
		if($this->Datas->getDataFimSubmissao() < date('Y-m-d H:i:s') && !$this->isAdmin()){
			$this->Session->setFlash(__('O prazo de submissão terminou, você não pode mais alterar este trabalho !'), 'flash/bootstrap', array('class'=>'alert alert-block'));
			$this->redirect('index');
		}
		$this->Trabalho->recursive = -1;
		$trabalho = $this->Trabalho->find('first', array('conditions' => array('Trabalho.' . $this->Trabalho->primaryKey => $id)));

		if (!$trabalho ) {
			throw new NotFoundException(__('Trabalho inválido'));
		}
		if(!$this->isAdmin() && ($trabalho['Trabalho']['usuario_id'] != $this->usuarioSessao['Usuario']['id'])){
			$this->notAuth();
		}
		if ($this->request->is('post') || $this->request->is('put')) {
			unset($this->request->data['Trabalho']['usuario_id']);
			unset($this->request->data['Trabalho']['revisor_id']);
			unset($this->request->data['Trabalho']['caminho']);
			unset($this->request->data['Trabalho']['nota']);
			unset($this->request->data['Trabalho']['justificativa']);
			unset($this->request->data['Trabalho']['avaliado_em']);
			if (($trabalho['Trabalho']['nota'] == null) && $this->Trabalho->save($this->request->data)) {
				$this->Session->setFlash(__('As alterações foram salvas'));
				$this->redirect(array('action' => 'view', $id));
			} else {
				$this->Session->setFlash(__('Não foi possível modificar o trabalho'), 'flash/bootstrap', array('class'=>'alert alert-error'));
			}
		} else {
			$options = array('conditions' => array('Trabalho.' . $this->Trabalho->primaryKey => $id));
			$this->request->data = $this->Trabalho->find('first', $options);
		}
		$usuarios = $this->Trabalho->Usuario->find('list');
		$revisors = $this->Trabalho->Revisor->find('list');
		$categorias = $this->Trabalho->Categoria->find('list');
		$sessaos = $this->Trabalho->Sessao->find('list');
		$this->set(compact('usuarios', 'revisors', 'categorias', 'sessaos'));
	}

	public function delete($id = null) {
		if($this->Datas->getDataFimSubmissao() < date('Y-m-d H:i:s') && !$this->isAdmin()){
			$this->Session->setFlash(__('O prazo de submissão terminou, você não pode mais remover este trabalho !'), 'flash/bootstrap', array('class'=>'alert alert-block'));
			$this->redirect('index');
		}
		$this->Trabalho->recursive = -1;
		$trabalho = $this->Trabalho->find('first', array('conditions' => array('Trabalho.' . $this->Trabalho->primaryKey => $id)));
		if(!$trabalho){
			throw new NotFoundException(__('Trabalho inválido'));
		}
		if($this->isAdmin() || $this->usuarioSessao['Usuario']['id'] == $trabalho['Trabalho']['usuario_id']){
			$this->Trabalho->id = $trabalho['Trabalho']['id'];
			$this->request->onlyAllow('post', 'delete');
			if ($this->Trabalho->delete()) {
				$this->Session->setFlash(__('Trabalho excluido !'), 'flash/bootstrap', array('class'=>'alert alert-success'));
				$this->redirect(array('action' => 'index'));
			}
			$this->Session->setFlash(__('Erro ao excluir o trabalho !'), 'flash/bootstrap', array('class'=>'alert alert-error'));
			$this->redirect(array('action' => 'index'));
		}
		else {
			$this->layout = false;
			$this->autoRender = false;
			$this->Session->setFlash(__('Você não tem permissão para acessar esse arquivo!'), 'flash/bootstrap', array('class'=>'alert alert-error'));
			$this->redirect('/pages/blank');
		}
	}
	
	public function download($id){
		//TODO testar
		if (!$this->Trabalho->exists($id)) {
			throw new NotFoundException(__('Trabalho inválido'));
		}
		$this->autoRender = false;
		$this->Trabalho->recursive = 1;
		$trabalho = $this->Trabalho->findById($id);
		$caminho_completo = DIRETORIO_TRABALHOS.DS.$trabalho['Trabalho']['caminho'];
		if($trabalho['Trabalho']['revisor_id'] == $this->usuarioSessao['Usuario']['id'] || $trabalho['Trabalho']['usuario_id'] == $this->usuarioSessao['Usuario']['id'] || $this->isAdmin()){
			header('Content-type: application/pdf');
			header('Content-Disposition: attachment; filename="'.$trabalho['Trabalho']['nome_original'].'"');
			header("Content-Length: " .(string)(filesize($caminho_completo)) );
			readfile($caminho_completo);
			//$this->redirect('/'.WWW_DIRETORIO_TRABALHOS.'/'.$string);
			
		}

		else {
			$this->notAuth();
		}

		//echo Router::url($this->here());
		//$this->response->download();
		//$this->response->send();
	
	}
}